/**   
* @Project:	Mybatis
* @Title: JdbcTest.java
* @Package com.sise.mybatis.jdbc
* @Description: jdbc程序入门,总结jdbc操作数据库存在的问题
* @author: zhiguo.lin   
* @date 2016年8月13日 上午7:14:10
* @CopyRight: CopyRight@2016
* @version V1.0   
*/

/*
 *  jdbc程序问题总结：
 *
 *  1.数据库连接，使用时就创捷，不使用立即释放，对数据库连接进行频繁的创建和关闭，造成数据库资源浪费，影响数据库性能
 *      设想：使用数据库连接池管理数据库连接
 *  2.将sql语句硬编码在程序中，如果sql语句修改，需要重新编译java代码，不利于系统的维护
 *      设想：将sql语句配置在xml文件中，即使sql语句改变，也不需要重新编译java代码
 *  3.向preparedStatement中设置参数，对占位符号位置和设置参数值，硬编码在java代码中，不利于系统维护
 *      设想：将sql语句及占位符号和参数全部配置在xml中。
 *  4.从resutSet中遍历结果集数据时，存在硬编码，将获取表的字段进行硬编码，，不利于系统维护。
 *      设想：将查询的结果集，自动映射成java对象。
 */

package com.sise.mybatis.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;


/**
 * @ClassName: JdbcTest
 * @Description: Jdbc入门程序
 * @author: zhiguo.lin
 * @date 2016年8月13日 上午7:14:10
 * 
 */

public class JdbcTest {

    public static void main(String[] args) {
        
        //数据库连接的url
        final String URL = "jdbc:mysql://localhost:3306/test?characterEncoding=utf-8";
        //数据库连接用户名
        final String USERNAME = "root";
        //数据库连接密码
        final String PASSWORD = "root";
        
        //创建数据库连接
        Connection conn = null;
        //预编译的Statement,使用预编译的preparedStatement提高数据库查询的性能
        PreparedStatement preparedStatement = null;
        //结果集
        ResultSet resultSet = null;
        
        try {
            
            //加载数据库驱动
            Class.forName("com.mysql.jdbc.Driver");
            //通过数据库驱动管理类获取连接
            conn = DriverManager.getConnection(URL, USERNAME, PASSWORD);
            //通过数据库连接对象获取预处理的statement对象
            String sql = "SELECT * FROM USER WHERE USERNAME = ?";
            preparedStatement = conn.prepareStatement(sql);
            //给占位符赋值
            preparedStatement.setString(1, "王五");
            //执行查询
            resultSet = preparedStatement.executeQuery();
            //遍历结果集
            while(resultSet.next()){
                System.out.println(resultSet.getString("id") + ":" + resultSet.getString("username"));
            }
           
            
        } catch (ClassNotFoundException e) {
            
            //当应用程序视图加载一个不存在的类时，抛出该异常
            e.printStackTrace();
            
        } catch (SQLException e) {
            
           /*if a database access error occurs; this method is called on a closed PreparedStatement
               or the SQL statement does not return a ResultSet object*/
            
            e.printStackTrace();
            
        }finally{
            
            //释放资源
            if(resultSet != null){
                
                try {
                    resultSet.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
            
            if(preparedStatement != null){
                
                try {
                    preparedStatement.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
            
            if(conn != null){
                
                try {
                    conn.close();
                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                
            }
        }
        
        
    }
    
    

}